﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data.Entity;
using Kendo.Mvc.UI;
using Kendo.Mvc.Extensions;
using QLGT_2.Models;
using System.Web.Script.Serialization;
using System.Data.OleDb;
using System.Data;
using System.Data.Entity.Validation;
using System.Text;

namespace QLGT_2.Controllers
{
    public class QLTaiKhoanController : Controller
    {
        QLGTContext db = new QLGTContext();
        List<SelectListItem> mess = new List<SelectListItem>();
        int stt = 0,No = 0,MaCN;
        bool KTChucNang;

        private void SaveChanges(DbContext context)
        {
            try
            {
                context.SaveChanges();
            }
            catch (DbEntityValidationException ex)
            {
                StringBuilder sb = new StringBuilder();

                foreach (var failure in ex.EntityValidationErrors)
                {
                    sb.AppendFormat("{0} failed validation\n", failure.Entry.Entity.GetType());
                    foreach (var error in failure.ValidationErrors)
                    {
                        sb.AppendFormat("- {0} : {1}", error.PropertyName, error.ErrorMessage);
                        sb.AppendLine();
                    }
                }

                throw new DbEntityValidationException(
                    "Entity Validation Failed - errors follow:\n" +
                    sb.ToString(), ex
                ); // Add the original exception as the innerException
            }
        }


        #region QLChucNang
        public JsonResult LayChucNang()
        {
            var chucNang = from a in db.tbl_ChucNangs
                            select new
                            {
                                MaCN = a.MaCN,
                                TenCN = a.TenCN,
                                Link = a.Link,
                                VietTat = a.VietTat,
                                MaCNCha = a.MaCNCha,
                                CSSIcon = a.CSSIcon,
                                TrangThai = a.TrangThai,
                                ThuTuHienThi = a.ThuTuHienThi,
                                LaMenu = a.LaMenu,
                                TenCNCha = db.tbl_ChucNangs.Where(m => m.MaCN == a.MaCNCha).FirstOrDefault().TenCN
                            };
            return Json(chucNang.ToList(), JsonRequestBehavior.AllowGet);
            //return Json(db.tbl_ChucNangs.ToList(), JsonRequestBehavior.AllowGet);
        }


        public ActionResult ChucNang()
        {
            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult HienThiChucNang([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.tbl_ChucNangs.ToDataSourceResult(request));
        }

        //[ValidateAntiForgeryToken]
        public ActionResult TaoChucNang([DataSourceRequest] DataSourceRequest request, tbl_ChucNang data)
        {
            //bool state = false;
            //string mess = "";
            if (data != null && ModelState.IsValid)
            {
                var createdata = db.tbl_ChucNangs.Where(m => m.TenCN.ToString().ToLower() == data.TenCN.ToString().ToLower().Trim() &&
                                                        m.Link.ToString().ToLower() == data.Link.ToString().ToLower().Trim()).ToList().Count;
                if (createdata == 0)
                {
                    db.tbl_ChucNangs.Add(data);
                    db.SaveChanges();
                    ////mess = "Thêm mới thành công!";
                    // state = true;
                }
                else
                {
                    return View("ChucNang");
                    //mess = "Chức vụ đã tồn tại!";
                    //ModelState.AddModelError("Lỗi", "Chức vụ đã tồn tại");
                    //return View(createdata.AsQueryable().ToDataSourceResult(request, ModelState));
                }
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult SuaChucNang([DataSourceRequest] DataSourceRequest request, tbl_ChucNang data)
        {
            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult XoaChucNang([DataSourceRequest] DataSourceRequest request, tbl_ChucNang data)
        {
            if (data != null)
            {
                tbl_ChucNang itemdata = db.tbl_ChucNangs.First(item => item.MaCN == data.MaCN);
                db.tbl_ChucNangs.Remove(itemdata);
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult ImportChucNang(HttpPostedFileBase FileImport)
        {
            bool state = false;
            if (FileImport != null)
            {
                // thuc hien thao tac tai day
                if (FileImport.ContentLength > 0)
                {
                    string Extension = System.IO.Path.GetExtension(FileImport.FileName);
                    if (Extension == ".xls" || Extension == ".xlsx")
                    {
                        string path = string.Concat(Server.MapPath("~/Uploads/File/" + DateTime.Now.ToString("MMddyyyyHHmmssfff") + FileImport.FileName));
                        //if (System.IO.File.Exists(path))
                        //{

                        //    System.IO.File.Delete(path);
                        //}
                        FileImport.SaveAs(path);
                        OleDbConnection oledbcon = new OleDbConnection("provider=microsoft.ace.oledb.12.0;data source=" + path + ";extended properties=excel 12.0;");
                        oledbcon.Open();
                        DataTable ExcelSheets = oledbcon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        string SpreadSheetName = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
                        OleDbCommand oledbcmd = new OleDbCommand("Select * from [" + SpreadSheetName + "]", oledbcon);
                        OleDbDataAdapter oledbda = new OleDbDataAdapter(oledbcmd);

                        DataTable dt = new DataTable();
                        var ListFuntions = db.tbl_ChucNangs;
                        tbl_ChucNang item;
                        oledbda.Fill(dt);
                        if (dt.Rows.Count > 0)
                        {
                            if (!dt.Columns.Contains("Chức năng"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Chức năng không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("Tên viết tắt"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Tên viết tắt không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("Link"))
                            {
                                mess.Add(new SelectListItem { Text = "Đường Link không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("Chức năng cha"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Chức năng cha không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("Là Menu"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Là Menu không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("Trạng thái"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Trạng thái không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("Icon"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Icon không tồn tại!" });
                                goto next;
                            }

                            for (int i = 0; i < dt.Rows.Count - 1; i++)
                            {
                                if (dt.Rows[i]["Chức năng cha"].ToString().Trim() == "")
                                {
                                    MaCN = 0;
                                }
                                else
                                {
                                    foreach (var a in ListFuntions)
                                    {
                                        if (a.TenCN.ToLower().Trim() == dt.Rows[i]["Chức năng cha"].ToString().ToLower().Trim())
                                        {
                                            MaCN = a.MaCN;
                                            break;
                                        }
                                    }
                                }

                                //KT ton tai
                                foreach (var a in ListFuntions)
                                {
                                    KTChucNang = false;
                                    if (dt.Rows[i]["Chức năng cha"].ToString().Trim()!="")
                                    {
                                        string Parent = dt.Rows[i]["Chức năng cha"].ToString().ToLower().Trim();
                                        var idParent = db.tbl_ChucNangs.Where(m => m.TenCN.ToLower().Trim() == Parent).FirstOrDefault().MaCN.ToString().Trim();
                                        if (a.TenCN.ToLower().Trim() == dt.Rows[i]["Chức năng"].ToString().ToLower().Trim() && a.MaCNCha.ToString().Trim() == idParent)
                                        {
                                            KTChucNang = true;
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        if (a.TenCN.ToLower().Trim() == dt.Rows[i]["Chức năng"].ToString().ToLower().Trim())
                                        {
                                            KTChucNang = true;
                                            break;
                                        }
                                    }
                                    
                                }
                                //try
                                //{
                                if (!KTChucNang)
                                {
                                    item = new tbl_ChucNang();
                                    item.TenCN = dt.Rows[i]["Chức năng"].ToString().Trim();
                                    item.Link = dt.Rows[i]["Link"].ToString().Trim();
                                    item.MaCNCha = MaCN;
                                    item.CSSIcon = dt.Rows[i]["Icon"].ToString().Trim();
                                    if (dt.Rows[i]["Là Menu"].ToString().Trim() == "Đúng")
                                    {
                                        item.LaMenu = 1;
                                    }
                                    else
                                    {
                                        item.LaMenu = 0;
                                    }
                                    item.ThuTuHienThi = int.Parse(dt.Rows[i]["Thứ tự"].ToString().Trim());
                                    if (dt.Rows[i]["Trạng thái"].ToString().Trim() == "Sử dụng")
                                    {
                                        item.TrangThai = 1;
                                    }
                                    else
                                    {
                                        item.TrangThai = 0;
                                    }
                                    item.VietTat = dt.Rows[i]["Tên viết tắt"].ToString().Trim();
                                    db.tbl_ChucNangs.Add(item);
                                    db.SaveChanges();
                                }
                                else
                                {
                                    mess.Add(new SelectListItem { Text = "Chức năng: " + dt.Rows[i]["Chức năng"].ToString() + " đã tồn tại!" });
                                }
                            }

                        next:
                            if (mess.Count() > 0)
                            {
                                state = false;
                                if (No > 0)
                                {
                                    mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                                }
                            }
                            else
                            {
                                state = true;
                                mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                            }
                        }
                        else
                        {
                            Response.Write("Bạn phải nhập file định dạng excel!");
                        }
                        oledbcon.Close();
                        System.IO.File.Delete(path);
                    }

                }
            }
            else
                mess.Add(new SelectListItem { Text = "Có lỗi" });

            return Json(new { State = state, Message = mess });
        }
        #endregion

        #region QLQuyen
        public JsonResult LayQuyen()
        {
            return Json(db.tbl_Quyens.ToList(), JsonRequestBehavior.AllowGet);
        }
        public ActionResult Quyen()
        {
            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult HienThiQuyen([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.tbl_Quyens.ToDataSourceResult(request));
        }

        //[ValidateAntiForgeryToken]
        public ActionResult TaoQuyen([DataSourceRequest] DataSourceRequest request, tbl_Quyen data)
        {
            //bool state = false;
            //string mess = "";
            if (data != null && ModelState.IsValid)
            {
                var createdata = db.tbl_Quyens.Where(m => m.Quyen.ToString().ToLower() == data.MaQuyen.ToString().ToLower().Trim()).ToList().Count;
                if (createdata == 0)
                {
                    db.tbl_Quyens.Add(data);
                    db.SaveChanges();
                    // state = true;
                    ////mess = "Thêm mới thành công!";
                }
                else
                {
                    return View("Quyen");
                    //mess = "Chức vụ đã tồn tại!";
                    //ModelState.AddModelError("Lỗi", "Chức vụ đã tồn tại");
                    //return View(createdata.AsQueryable().ToDataSourceResult(request, ModelState));
                }
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult SuaQuyen([DataSourceRequest] DataSourceRequest request, tbl_Quyen data)
        {
            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult XoaQuyen([DataSourceRequest] DataSourceRequest request, tbl_Quyen data)
        {
            if (data != null)
            {
                tbl_Quyen itemdata = db.tbl_Quyens.First(item => item.MaQuyen == data.MaQuyen);
                db.tbl_Quyens.Remove(itemdata);
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        #endregion

        #region Them Quyen
        public ActionResult ThemQuyen(string id)
        {
            List<tbl_ChucNang> all = new List<tbl_ChucNang>();
            all = db.tbl_ChucNangs.ToList();
            var idrequest = db.tbl_ChucNang_Quyens;
            List<SelectListItem> list = new List<SelectListItem>();
            list.Add(new SelectListItem { Text = "Hoạt động", Value = "1" });
            list.Add(new SelectListItem { Text = "Không hoạt động", Value = "0" });

            if (id != null && ModelState.IsValid)
            {
                //if (!CheckRole.IsRole("qltk_q_s", Session["Function"] as string[]))
                //    return Redirect("~/ChanTruyCap.html");
                //return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

                //if (idrequest.Count() != 0)
                //{
                    ViewBag.IDRequest = id;
                    int idacting = int.Parse(id);
                    var acting = db.tbl_Quyens.Where(m => m.MaQuyen == idacting).FirstOrDefault();
                    ViewBag.Funtion = db.tbl_ChucNang_Quyens.Where(m => m.MaQuyen == idacting).Select(m => m.MaCN).ToArray();
                    ViewBag.TrangThai = new SelectList(list, "Value", "Text", acting.TrangThai);
                    ViewBag.Acting = acting.Quyen;
                //}
            }
            else
            {
                //if (!CheckRole.IsRole("qltk_q_t", Session["Function"] as string[]))
                //    return Redirect("~/ChanTruyCap.html");

                ViewBag.TrangThai = new SelectList(list, "Value", "Text");
            }
            if (!Request.IsAjaxRequest())
                return View(all);

            return PartialView(all);
        }
        [HttpPost]
        [ActionName("ThemQuyen")]
        public ActionResult Post_ThemQuyen()
        {
            tbl_Quyen Quyen;
            tbl_ChucNang_Quyen ChucNang_Quyen;
            if (Request.Form["checkedFiles"] != null)
            {
                string[] Checked = Request.Form["checkedFiles"].Split(',');
                var listActing = db.tbl_ChucNangs.ToList();
                List<string> listofLast = new List<string>();
                foreach (var a in Checked)
                {
                    int Nephew = int.Parse(a.Trim());
                    var Child = listActing.Where(m => m.MaCN == Nephew).FirstOrDefault().MaCNCha;
                    if (Child != 0)
                    {
                        var Fahther = listActing.Where(m => m.MaCN == Child).FirstOrDefault().MaCNCha;
                        if (Fahther != 0)
                        {
                            listofLast.Add(Fahther.ToString());
                        }
                        listofLast.Add(Child.ToString());
                    }
                    listofLast.Add(a);
                }
                listofLast = listofLast.Distinct().ToList();

                if (Request.Form["MyActing"] != null)
                {
                    string nameacting = Request.Form["MyActing"].Trim();
                    int requestidacting = db.tbl_Quyens.AsNoTracking().Where(m => m.Quyen == nameacting).FirstOrDefault().MaQuyen;
                    //
                    //var idacting = db.TbQuyens.Where(m => m.Quyen == nameacting).FirstOrDefault().MaQuyen;
                    var listidfuntion_acting = db.tbl_ChucNang_Quyens.Where(m => m.MaQuyen == requestidacting);
                    tbl_Quyen quyen = new tbl_Quyen();
                    //db.TbTinTucs.AsNoTracking().First(e => e.MaTinTuc == item.MaTinTuc).AnhDaiDien
                    quyen.MaQuyen = requestidacting;
                    quyen.Quyen = Request.Form["MyActing"].Trim();
                    quyen.TrangThai = int.Parse(Request.Form["Value"].Trim());
                    db.Entry(quyen).State = EntityState.Modified;
                    SaveChanges(db);
                    if (listidfuntion_acting != null)
                    {
                        foreach (var a in listidfuntion_acting)
                        {
                            db.tbl_ChucNang_Quyens.Remove(a);
                        }
                        db.SaveChanges();
                    }
                    foreach (var a in listofLast)
                    {
                        ChucNang_Quyen = new tbl_ChucNang_Quyen{ MaQuyen = requestidacting, MaCN = int.Parse(a), TrangThai = 1 };
                        db.tbl_ChucNang_Quyens.Add(ChucNang_Quyen);
                        db.SaveChanges();
                    }
                }
                else
                {
                    string actingname = Request.Form["txtActing"].Trim();

                    if (db.tbl_Quyens.Where(m => m.Quyen == actingname).Count() == 0)
                    {
                        Quyen = new tbl_Quyen { Quyen = actingname, TrangThai = int.Parse(Request.Form["Value"].Trim()) };
                        db.tbl_Quyens.Add(Quyen);
                        db.SaveChanges();
                        foreach (var a in listofLast)
                        {
                            ChucNang_Quyen = new tbl_ChucNang_Quyen { MaQuyen = db.tbl_Quyens.Where(m => m.Quyen == actingname).FirstOrDefault().MaQuyen, MaCN = int.Parse(a), TrangThai = 1 };
                            db.tbl_ChucNang_Quyens.Add(ChucNang_Quyen);
                            SaveChanges(db);
                        }
                    }
                }
            }
            else
            {
                if (Request.Form["MyActing"] != null)
                {
                    tbl_Quyen quyen = new tbl_Quyen();
                    quyen.MaQuyen = int.Parse(Request.Form["IDActing"].Trim());
                    quyen.Quyen = Request.Form["MyActing"].Trim();
                    quyen.TrangThai = int.Parse(Request.Form["Value"].Trim());
                    db.Entry(quyen).State = EntityState.Modified;
                }
                else
                {
                    string actingname = Request.Form["txtActing"].Trim();
                    if (db.tbl_Quyens.Where(m => m.Quyen == actingname).Count() == 0)
                    {
                        Quyen = new tbl_Quyen { Quyen = actingname, TrangThai = int.Parse(Request.Form["Value"].Trim()) };
                        db.tbl_Quyens.Add(Quyen);
                    }
                }
                SaveChanges(db);
            }
            return RedirectToAction("Quyen");
        }
        #endregion

        #region QLNguoiDung
        public JsonResult LayNguoiDung()
        {
            return Json(db.tbl_NguoiDungs.ToList(), JsonRequestBehavior.AllowGet);
        }
        public ActionResult NguoiDung()
        {
            ViewBag.Quyen = db.tbl_Quyens.ToList();

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult HienThiNguoiDung([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.tbl_NguoiDungs.ToDataSourceResult(request));
        }

        //[ValidateAntiForgeryToken]
        public ActionResult TaoNguoiDung([DataSourceRequest] DataSourceRequest request, tbl_NguoiDung data)
        {
            //bool state = false;
            //string mess = "";
            if (data != null && ModelState.IsValid)
            {
                var createdata = db.tbl_NguoiDungs.Where(m => m.TenDangNhap.ToString().ToLower() == data.TenDangNhap.ToString().ToLower().Trim()).ToList().Count;
                if (createdata == 0)
                {
                    db.tbl_NguoiDungs.Add(data);
                    db.SaveChanges();
                }
                else
                {
                    return View("NguoiDung");
                }
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult SuaNguoiDung([DataSourceRequest] DataSourceRequest request, tbl_NguoiDung data)
        {
            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult XoaNguoiDung([DataSourceRequest] DataSourceRequest request, tbl_NguoiDung data)
        {
            if (data != null)
            {
                tbl_NguoiDung itemdata = db.tbl_NguoiDungs.First(item => item.TenDangNhap == data.TenDangNhap && item.MaQuyen == data.MaQuyen);
                db.tbl_NguoiDungs.Remove(itemdata);
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        #endregion

        #region ThemNguoiDung
        public ActionResult ThemNguoiDung(string id)
        {
            tbl_NguoiDung User = new tbl_NguoiDung();
            //if(ModelState.IsValid)
            //{
            if (id != null)
            {
                ViewBag.IDRequest = id;
                User = db.tbl_NguoiDungs.First(m => m.TenDangNhap == id);

                ViewBag.Quyen = new SelectList(db.tbl_Quyens.ToList(), "MaQuyen", "Quyen", User.MaQuyen);
            }
            else
            {
                ViewBag.Quyen = new SelectList(db.tbl_Quyens.ToList(), "MaQuyen", "Quyen");
            }
            //s}

            if (!Request.IsAjaxRequest())
                return View(User);

            return PartialView(User);
        }
        [HttpPost]
        public ActionResult ThemNguoiDung(tbl_NguoiDung item, string id)
        {
            bool state = false;
            string mess = "";
            if (item != null)
            {
                if (id != null)
                {
                    //foreach (var a in id)
                    //{
                    //    a
                    //}
                    item.TenDangNhap = Request.Form["UserName"].Trim();
                    item.MatKhau = DuLieuChung.MaHoaMD5(item.MatKhau);
                    item.RandomPass = "1234zxcv";
                    item.MaQuyen = item.MaQuyen;
                    db.Entry(item).State = EntityState.Modified;
                    SaveChanges(db);
                    state = true;
                    mess = "Thực hiện sửa thành công!";
                }
                else
                {

                    if (db.tbl_NguoiDungs.Where(m => m.TenDangNhap == item.TenDangNhap).Count() == 0)
                    {
                        item.MatKhau = DuLieuChung.MaHoaMD5(item.MatKhau);
                        item.RandomPass = "1234zxcv";
                        item.MaQuyen = item.MaQuyen;
                        db.tbl_NguoiDungs.Add(item);
                        SaveChanges(db);
                        state = true;
                        mess = "Thực hiện thêm thành công!";
                    }

                }

            }
            ViewBag.Quyen = db.tbl_Quyens.ToList();
            //mess = "Lỗi!";
            return View("NguoiDung");
        }
        #endregion
    }
}